package com.lxw.question;

public class Q12 {
    /**
     * 题目描述
     * 实现函数double Power(double base, int exponent)，
     * 求base的exponent次方。不得使用库函数，同时不需要考虑大数问题。
     * 链接：https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
     */

    public static double myPow(double x, int n) {
        //处理n==0的特殊情况
        if(n == 0)
            return 1;

        //如果n为负数，需要将你转为正数，这样写  return myPow(1/x,-n);
        //但是这样写有一个bug当n为Integer.MIN_VALUE时，这时对n取反，得到的还是Integer.MIN_VALUE.所以要这样写
        //return 1/x * myPow(1/x,-n-1); ---->我们知道myPow这个函数做的是对1/x连乘-n次，我们提取出来一个1/x,那么后面的-n就要减一
        //就是-n-1,这时-n-1就变成Integer.MAX_VALUE;相当于将Integer.MIN_VALUE向左移了一位，就变成了Integer.MAX_VALUE;
        if(n < 0)
            return 1/x*myPow(1/x,-n-1);

        return n % 2 == 0 ? myPow(x*x,n/2) : x * myPow(x*x,n/2);
    }


    public static void main(String[] args){
        //0.00001 2147483647
        double result = myPow(0.00001,1);

        System.out.println(result);

        //Integer.MIN_VALUE向左移动一位的值位Integer.MAX_VALUE
        System.out.println("Integer.MIN_VALUE向左移动一位的值："+(Integer.MIN_VALUE - 1));
    }
}
